package com.mini;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class MiniBasicRowProcessor implements MiniRowProcessor {
    // 实际使用的Bean实例转换器
    private final MiniBeanProcessor convert;

    /* 如果没有通过构造函数传递实例转换器，将使用默认的转换器
     * DEFAULT_CONVERT 该转换器仅支持属性名和字段的完全映射
     * Generous_CONVERT 该转换器允许数据库的字段名含有下划线*/
    public MiniBasicRowProcessor() {
        this(DEFAULT_CONVERT);
    }
    public MiniBasicRowProcessor(MiniBeanProcessor convert) {
        super();
        this.convert = convert;
    }

    @Override
    public Map<String, Object> toMap(ResultSet rs) throws SQLException {
        // 创建一个储存介质，用来储存解析后的数据，也是当前查询语句的返回对象
        Map<String, Object> resultMap = new HashMap();
        /* 获取当前行的结果元数据
         * ResultSetMetaData 结果元数据对象表示对当前列数据的描述；内部封装了列的数量、类型和属性等信息 */
        ResultSetMetaData rsmd = rs.getMetaData();
        // 从结果元数据中获取当前行的列数
        int cols = rsmd.getColumnCount();
        // 根据列的数量遍历取值，key就是字段名称，value就是字段值
        for (int i = 1; i <= cols; i++) {
            /* 从结果元数据中获取查询字段的别名
             * 例如: select id as uid 中的uid是别名，id是列名 */
            String columnName = rsmd.getColumnLabel(i);
            // 如果别名不存在就取列名
            if (null == columnName || 0 == columnName.length()) {
                columnName = rsmd.getColumnName(i);
            }
            // 以列名（字段名或别名）为Key，列值（字段值）为value，将记录插入到集合中
            resultMap.put(columnName, rs.getObject(i));
        }
        return resultMap;
    }

    @Override
    public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException {
        return this.convert.toBean(rs, type);
    }
}
